CC = arm-linux-gcc # 指定使用的交叉编译工具(根据项目情况修改)

TARGET = drawing_software # 生成的可执行文件名(根据项目情况修改)

# --------------------以下为指定编译器参数(根据项目情况修改)--------------------
# -std=gnu99: 支持C99标准
# -Wall: 是打开警告开关
CFLAGS := -std=gnu99 -Wall -lm

# --------------------以下为指定头文件路径(根据项目情况修改)--------------------
CFLAGS += -I/home/hu/linux_project/module/framebuffer/zlib-1.2.11/__install/include
CFLAGS += -I/home/hu/linux_project/module/framebuffer/libpng-1.6.37
CFLAGS += -I/home/hu/linux_project/module/framebuffer/libpng-1.6.37/__install/include

# 链接器的链接参数设置(根据项目情况修改)
# --------------------以下为指定头文件路径(根据项目情况修改)--------------------
# pthread不是linux下的默认的库，如果这里不加-lpthread，则在链接的时候无法找到phread库中各函数的入口地址，链接会失败
LDFLAGS := -lpthread
LDFLAGS += -lz -L/home/hu/linux_project/module/framebuffer/zlib-1.2.11/__install/lib
LDFLAGS += -lpng -L/home/hu/linux_project/module/framebuffer/libpng-1.6.37/__install/lib

# 获取各工程文件所在的相对目录(根据项目情况修改)
TOP_PATH = .
TOUCH_PATH = ./touch
DISPLAY_PATH = ./display
FRAMEBUFFER_PATH = ./display/framebuffer
FRAMEBUFFER_PNG_PATH = ./display/framebuffer_png

# 获取工程中各文件夹下的源文件(.c)、目标文件(.o)的文件列表(根据项目情况修改)
TOP_SRC = $(wildcard $(TOP_PATH)/*.c) # 获取当前目录下的所有的.c文件列表
TOP_OBJ = $(patsubst %.c, %.o, $(TOP_SRC)) # 将列表中所有文件名的后缀.c替换为.o。这样就可以得到在当前目录可生成的.o文件列表。 patsubst ：替换通配符
TOUCH_SRC = $(wildcard $(TOUCH_PATH)/*.c)
TOUCH_OBJ = $(patsubst %.c, %.o, $(TOUCH_SRC))
DISPLAY_SRC = $(wildcard $(DISPLAY_PATH)/*.c)
DISPLAY_OBJ = $(patsubst %.c, %.o, $(DISPLAY_SRC))
FRAMEBUFFER_SRC = $(wildcard $(FRAMEBUFFER_PATH)/*.c)
FRAMEBUFFER_OBJ = $(patsubst %.c, %.o, $(FRAMEBUFFER_SRC))
FRAMEBUFFER_PNG_SRC = $(wildcard $(FRAMEBUFFER_PNG_PATH)/*.c)
FRAMEBUFFER_PNG_OBJ = $(patsubst %.c, %.o, $(FRAMEBUFFER_PNG_SRC))

# 所有目标文件的集合(根据项目情况修改)
TARGET_OBJS = $(TOP_OBJ) $(TOUCH_OBJ) $(DISPLAY_OBJ) $(FRAMEBUFFER_OBJ) $(FRAMEBUFFER_PNG_OBJ)

# --------------------以下为编译默认目标规则(不需要修改)--------------------
# Makefile的默认目标
$(TARGET):$(TARGET_OBJS)
	$(CC) $(CFLAGS) $(LDFLAGS) -o $(TARGET) $^
	@echo "compile done, target file: $(TARGET)"

# --------------------以下为编译各子文件夹规则(根据项目情况修改)--------------------
# 编译TOP_PATH下的.c文件 为.o文件
TOP_OBJ:$(TOP_SRC)
	$(CC) $(CFLAGS) $(LDFLAGS) $(TOP_SRC) -c -o $^

# 编译TOUCH_PATH下的.c文件 为.o文件
TOUCH_OBJ:$(TOUCH_SRC)
	$(CC) $(CFLAGS) $(LDFLAGS) $(TOUCH_SRC) -c -o $^

# 编译DISPLAY_PATH下的.c文件 为.o文件
DISPLAY_OBJ:$(DISPLAY_SRC)
	$(CC) $(CFLAGS) $(LDFLAGS) $(DISPLAY_SRC) -c -o $^

# 编译FRAMEBUFFER_PATH下的.c文件 为.o文件
FRAMEBUFFER_OBJ:$(FRAMEBUFFER_SRC)
	$(CC) $(CFLAGS) $(LDFLAGS) $(FRAMEBUFFER_SRC) -c -o $^

# 编译FRAMEBUFFER_PATH下的.c文件 为.o文件
FRAMEBUFFER_PNG_OBJ:$(FRAMEBUFFER_PNG_SRC)
	$(CC) $(CFLAGS) $(LDFLAGS) $(FRAMEBUFFER_PNG_SRC) -c -o $^

# --------------------以下为清除规则(不需要修改)--------------------
# 清理目标设置为伪目标，防止外面有clean文件 阻止执行clean
.PHONY:clean
clean:
	-$(RM) $(TARGET_OBJS)
	@echo "clean object file done!"

# 清理目标设置为伪目标
.PHONY:distclean
distclean:
	-$(RM) $(TARGET) $(TARGET_OBJS)
	@echo "clean target and object file done!"